// `boolean`用于最直接的逻辑处理，它只有两种值：对（`true`）、错(`false`)
// let bol:boolean = true;
// bol = false;
// bol = true;
// bol = 1;// 异常

// 使用number定义数字类型。
// let num:number = 1;
// num = 2;
// num = 40;
// num = true;// 异常


// 使用string
// let strs:string = "abc";
// strs = "d";
// strs = 1;


// 在类型后面接上 `[]`，表示数组
// const arr = [1,2,3,4];
// const arr2:number[] = [1,2,3,"a"];// 数组的元素类型只允许是number
// const arr3:string[] = ["a",1];// 数组的元素类型只允许是number
// const arr4:(string | number)[] = [1,"a",true];// 元素类型只允许是number或string
// const arr5:any[] = [1,2,3,4,true,[1],"a"];// 不限制数组元素类型
// const arr6:any[] = 1;// 异常：类型不对


// 元组类型可以用于表示元素类型不同的数组，但前提是你要知道元素的数量与类型。
// 如下，我定义了第一个元素为`string`类型，第二个元素为`number`类型的元组。
// const arr7:[string,number] = ["a",1];

// 当你数据类型不确定时，或者数组当中只知道部分元素的类型时，你就可以使用它了。
// const a:any = 1;
// const b:any = "a";
// const c:any = [];
// const d:any = {};
// const arr:number[]=[1,2,3,4];
// const num:any =  arr.find(v=>v===2);


// null与undefined
// `null`与`undefined`在学习`JS`时应该已经很熟悉了。
// 关于`null`与`undefined`类型定义自身的这种行为，本身没有什么意义：
// const a:null = null;
// const b:undefined=undefined;

// `void`类型与`any`类型相反，它表示没有任何类型。
// 声明一个`void`类型的变量是没有什么意义的，因为它的值只能是`undefined`.
// const a:void = undefined;
// void常与函数结合使用，可以控制函数的返回类型.不允许有返回值
// function fn():void{
//     // return undefined;
// }


// `enum` 类型是对 JavaScript 标准数据类型的一个补充，
// 使用枚举类型可以`为一组数值赋予友好的名字`。 如果在程序中能灵活的使用`enum`,会让程序有更好的可读性。
// // 1- enum类型所使用的关键字为enum
// // 2- enum一般首字母大写，以enum结尾
// // 3- enum的成员建议大写，多个单词之间使用_
//
// // enum SexEnum {
// //     GIRL,
// //     BOY
// // }
// // console.log(SexEnum.GIRL,SexEnum.BOY);// 0 1
//
// // enum SexEnum {
// //     GIRL=1,
// //     BOY
// // }
// // console.log(SexEnum.GIRL,SexEnum.BOY);// 1 2
//
// // 解构赋值
// enum SexEnum {
//     GIRL=1,
//     BOY
// }
// const {GIRL,BOY} = SexEnum;
// console.log(GIRL,BOY);// 1 2
// const sex = 1;
// if(sex === GIRL){
//     console.log("女生");
// }


// `object` 表示非原始类型，也就是除 `number`，`string`，`boolean`之外的类型。
// const obj:object = {};
// const arr:object = [];
// const fn:object = function(){
//
// }


// 联合类型（Union Types）表示取值可以为多种类型中的一种
// let str2:string = "abc";
// let num:number =12;
// let a:number | string = "abc";
// a = 12;
//
// // 如果使用联合类型，建议为类型注释加上（）
// let a2:(number | string) = "abc";
// let arr:(number | string)[] = [1,"abc"];


// TS会在没有明确的指定类型的时候推测出一个类型
// let userName = "zhangsan";// 相当于：let userName:string = "zhangsan"
// userName = 12;// 类型异常

//
// 通过*类型断言*这种方式可以告诉编译器，
// “相信我，我知道自己在干什么”。 类型断言好比其它语言里的类型转换，但是不进行特殊的数据检查和解构。
// 类型断言有两种形式。 其一是“尖括号”语法, 另一个为 `as` 语法

const arr = [1, 2, 3, 4];
const num: any = arr.find(v => v === 2);
// as 语法
const num2: number = (arr.find(v => v === 2)) as number;
const num3: number = arr.find(v => v === 2) as number;
// <>
const num4: number = <number>arr.find(v => v === 2);
console.log(num4);// 2

const num5:(number | undefined) = arr.find(v=>v===2);



